home *** CD-ROM | disk | FTP | other *** search
- TITLE DUMP HP
-
- ; Dumps graphics on the HP LaserJet
-
- PRINT MACRO MESSAGE ;PRINT A MESSAGE ON THE PRINTER
- LOCAL BACK,DONE
- PUSH AX
- LEA SI,MESSAGE
- BACK: LODSB
- CMP AL,'$' ;STRING TERMINATER
- JE DONE
- MOV DX,0
- MOV AH,1
- INT 14H
- JMP BACK
- DONE:
- POP AX
- ENDM
-
- INTERRUPTS SEGMENT AT 0H ;THIS IS WHERE THE SCREEN_DUMP INTERRUPT
- ORG 5H*4 ;IS LOCATED
- SCREEN_DUMP_INT LABEL DWORD
- INTERRUPTS ENDS
-
- CODESEG SEGMENT
- ASSUME CS:CODESEG
- ORG 100H ;ORG = 100H TO MAKE THIS INTO A .COM FILE
- FIRST: JMP INIT ;FIRST TIME THROUGH JUMP TO INITIALIZE ROUTINE
-
- PRTSC PROC NEAR ;THE SCREEN_DUMP INTERRUPT WILL NOW COME HERE.
- ASSUME CS:CODESEG
- PUSH AX ;SAVE THE USED REGISTERS FOR GOOD FORM
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH DI
- PUSH SI
- PUSH DS
- PUSH ES
-
- JMP OVER ;JUMP OVER DATA
-
- ;---------------------------------------------------------------
-
- OLD_PRTSC_INT DD ? ;OLD DUMP ROUTINE
- DOWN DB 0 ;DISTANCE DOWN
- XXX DW 0 ;CURRENT SCAN LINE
-
- SETUP DB 27,'*t100R' ;100 DPI GRAPHICS MODE
- DB 27,'*r2A' ;START RASTER GRAPHICS
- DB '$'
- READY DB 27,'&a+1V' ;MOVE DOWN 1 DECIPOINT
- DB 27,'*b80W' ;GET READY FOR 80 BYTES
- DB '$'
- ENDG DB 27,'*rB' ;END RASTER GRAPHICS
- DB '$'
- ;---------------------------------------------------------------
-
- OVER: ASSUME DS:CODESEG,ES:NOTHING
- MOV AX,0B800H ;FIX EXTRA SEGMENT REISTER
- MOV ES,AX ;TO POINT TO GRAPHICS SCREEN
- MOV AX,CS ;FIX DATA SEGMENT REGISTER
- MOV DS,AX ;TO POINT TO CODE SEGMENT
-
- MOV AH,0FH ;READ VIDEO MODE
- INT 10H
- CMP AL,7 ;MONOCHROME?
- JE OLD_DUMP ;YES -- USE OLD SCREEN DUMP ROUTINE
- CMP AL,3 ;TEXT MODE?
- JG START ;NO -- USE NEW SCREEN DUMP ROUTINE
-
- OLD_DUMP: PUSHF ;SAVE THE FLAGS
- CALL OLD_PRTSC_INT ;CALL OLD ROUTINE
- JMP OUT ;RETURN TO CALLER
-
- ;----- IF WE ARE HERE, WE MUST BE IN GRAPHICS MODE -----;
-
- START: PRINT SETUP ;SETUP PRINTER
- MOV DOWN,0 ;START AT 0 DOWN
- MOV XXX,0 ;COLUMN NUMBER
- NEXTROW: MOV CX,3 ;PRINT EACH ROW THREE TIMES
- ITERATION1: PRINT READY ;READY GRAPHICS
-
- MOV DI,XXX ;GET STARTING LOCATION
- PUSH CX ;SAVE CX
- MOV CX,80 ;DO THIS 80 TIMES
- LOOP1: MOV AL,ES:[DI] ;READ BYTE INTO DL
- MOV DX,0 ;PRINT BYTE
- MOV AH,1
- INT 14H
- ELOOP1: INC DI ;GET NEXT BYTE
- LOOP LOOP1
- POP CX ;GET CX BACK
- PRINT ENDG ;END RASTER GRAPHICS
- LOOP ITERATION1 ;DO THIS THREE TIMES
-
- MOV CX,80 ;REVERSE 80 BYTES
- MOV DI,XXX ;GET LOCATION
- RLOOP1: MOV AL,ES:[DI] ;READ BYTE
- XOR AL,11111111B ;REVERSE BYTE
- MOV ES:[DI],AL ;WRITE IT
- INC DI ;GET NEXT LOCATION
- LOOP RLOOP1
-
- MOV CX,3 ;DO THREE TIMES
- ITERATION2: PRINT READY ;READY GRAPHICS
- MOV DI,XXX ;GET STARTING LOCATION
- ADD DI,8192 ;DO NEXT ROW
- PUSH CX ;SAVE CX
-
- MOV CX,80 ;DO THIS 80 TIMES
- LOOP2: MOV AL,ES:[DI] ;READ BYTE INTO DL
- MOV DX,0 ;PRINT BYTE
- MOV AH,1
- INT 14H
- ELOOP2: INC DI ;GET NEXT BYTE
- LOOP LOOP2
- POP CX ;GET CX BACK
- PRINT ENDG
- LOOP ITERATION2 ;DO IT AGAIN
-
- MOV CX,80 ;REVERSE 80 BYTES
- MOV DI,XXX ;GET LOCATION
- ADD DI,8192 ;UPDATE IT
- RLOOP2: MOV AL,ES:[DI] ;READ BYTE
- XOR AL,11111111B ;REVERSE BYTE
- MOV ES:[DI],AL ;WRITE IT
- INC DI ;GET NEXT LOCATION
- LOOP RLOOP2
-
- ADD XXX,80 ;MOVE DOWN TO NEXT SCAN LINE
- INC DOWN ;INCREMENT DOWN COUNTER
- CMP DOWN,100
- JGE RESET ;DONE -- RESET SCREEN
- LEA AX,NEXTROW ;DO NEXT ROW
- JMP AX
-
- RESET: MOV CX,03FFFH ;RE-REVERSE SCREEN
- XOR DI,DI ;START AT 0
- LOOP3: MOV AL,ES:[DI] ;GET BYTE
- XOR AL,11111111B ;REVERSE IT
- MOV ES:[DI],AL ;WRITE IT
- INC DI
- LOOP LOOP3 ;GET NEXT
-
- OUT: POP ES ;POP FLAGS FROM STACK
- POP DS
- POP SI
- POP DI
- POP DX
- POP CX
- POP BX
- POP AX
- IRET ;RETURN TO CALLER
- PRTSC ENDP
-
- INIT PROC NEAR ;THIS PROCEDURE INTIALIZES EVERYTHING
- JMP HERE ;JUMP OVER DATA
-
- MSG1: DB 13,10
- DB 'DUMP GRAPHICS ONTO THE HP LASERJET PRINTER',13,10
- DB ' by Scott Pakin',13,10,10
- DB 'Press <shift> <PrtSc> to dump the graphics screen.',13,10
- DB 'Text modes will print using the regular screen dump routine.'
- DB 13,10
- DB '$'
-
- HERE: LEA DX,MSG1 ;PRINT INITIAL MESSAGE
- MOV AH,9
- INT 21H
-
- ASSUME DS:INTERRUPTS ;THE DATA SEGMENT WILL BE THE INTERRUPT AREA
- MOV AX,INTERRUPTS
- MOV DS,AX
-
- MOV AX,SCREEN_DUMP_INT ;STORE OLD LOCATION
- MOV OLD_PRTSC_INT,AX
- MOV AX,SCREEN_DUMP_INT[2]
- MOV OLD_PRTSC_INT[2],AX
-
- MOV SCREEN_DUMP_INT,OFFSET PRTSC ;NOW LOAD THE ADDRESS OF OUR NOTEPAD
- MOV SCREEN_DUMP_INT[2],CS ;ROUTINE INTO THE SCREEN_DUMP INTERRUPT
-
- EXIT: MOV DX,OFFSET INIT ;SET UP EVERYTHING BUT INIT TO
- INT 27H ;STAY AND ATTACH ITSELF TO DOS
- INIT ENDP
-
- CODESEG ENDS
-
- END FIRST ;END "FIRST" SO 8088 WILL GO TO FIRST FIRST.
-